/*
 * @(#)DialogPerson.java
 * 1.0, 2013-01-24
 */
package de.hdm.gruppenkalender.team04.gui;

import de.hdm.gruppenkalender.team04.data.Person;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.rmi.RemoteException;
import java.util.Vector;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.border.EmptyBorder;

/**
 * Aufbau des Person Dialog mit den diversen Elementen.
 *
 *
 * @author Mathias Bendel (mb167)
 * @author Björn Fichnter (bf023)
 * @author Stefan Hettich (sh176)
 * @author René Kugel (rk044)
 * @author Mark Leonberger (ml072)
 * @author Marta Przybylski (mp070)
 *
 * @version 1.0, 2013-01-24
 *
 */
public class DialogPerson extends JDialog {

    // Person die gestzt wird, wenn Bearbeiten-Fenster geöffnet wird.
    Person person;
    JTextField txtVorname;
    JTextField txtNachname;
    JTextField txtRaum;
    JTextField txtTelefon;
    JTextField txtEmail;
    JButton buttonSpeichern;
    HauptFenster hauptFenster;
    InterfaceClient ic = InterfaceClient.interfaceClient();
    /**
     * Platzhalter-Strings für die jeweiligen Textfelder.
     */
    private final static String STR_VORNAME =
            "Bitte geben Sie den Vornamen ein.";
    private final static String STR_NACHNAME =
            "Bitte geben Sie den Nachnamen ein.";
    private final static String STR_RAUM = "Bitte geben Sie den Raum ein.";
    private final static String STR_TELEFON =
            "Bitte geben Sie die Telefonnummer ein.";
    private final static String STR_EMAIL = "Bitte geben Sie die E-Mail ein.";

    /**
     * Konstruktor, der das aufrufende Hauptfenster übergibt.
     *
     * @param hf
     */
    public DialogPerson(HauptFenster hf) {
        this(hf, null);
    }

    /**
     * Konstruktor, der das aufrufende Hauptfenster und die zu
     * bearbeitende Person übergibt.
     * <p>
     * Der aktuelle Nutzer wird aus dem HauptFenster ausgelesen und
     * das Erstellen der Elemente wird angestoßen.
     *
     * @param hf
     * @param person
     */
    public DialogPerson(HauptFenster hf, Person person) {
        super(hf, "", true);
        this.hauptFenster = hf;
        this.person = person;
        this.erstelleElemente();
    }

    /**
     * Erstellt die Elemente des JDialogs.
     */
    public void erstelleElemente() {
        if (person == null) {
            this.setTitle("Person anlegen");
        } else {
            try {
                this.setTitle("Person '" + person.getVorname() + " " + person.
                        getNachname() + "' bearbeiten");
            } catch (RemoteException ex) {
                Logger.getLogger(DialogPerson.class.getName()).log(Level.SEVERE,
                        null, ex);
            }
        }

        this.add(erstelleHauptPanel());

        this.setLocation(50, 50);
        this.setResizable(false);

        this.pack();
        this.setVisible(true);
    }

    /**
     * Erstellt den Hauptpanel (Hauptinhaltsbereich) des JDialogs.
     * 
     * @return  JPanel  HauptPanel.
     */
    public JPanel erstelleHauptPanel() {
        JPanel hauptPanel = new JPanel();

        // GridBagLayout mit Abstand zwischen den Elementen.
        hauptPanel.setLayout(new GridBagLayout());
        GridBagConstraints c = new GridBagConstraints();
        c.fill = GridBagConstraints.HORIZONTAL;
        c.anchor = GridBagConstraints.LINE_START;
        c.insets = new Insets(5, 5, 5, 5);

        // Abstand nach außen erzeugen.
        hauptPanel.setBorder(new EmptyBorder(10, 10, 10, 10));

        /**
         * TextFeld und Label für Vorname.
         */
        c.gridx = 0;
        c.gridy = 0;
        c.gridwidth = 1;
        hauptPanel.add(new JLabel("Vorname:", JLabel.RIGHT), c);
        txtVorname = erstelleTextFeld(STR_VORNAME, true);

        c.gridx = 1;
        c.gridy = 0;
        c.gridwidth = 1;
        hauptPanel.add(txtVorname, c);

        /**
         * TextFeld und Label für Nachname.
         */
        c.gridx = 0;
        c.gridy = 1;
        c.gridwidth = 1;
        hauptPanel.add(new JLabel("Nachname:", JLabel.RIGHT), c);
        txtNachname = erstelleTextFeld(STR_NACHNAME, true);

        c.gridx = 1;
        c.gridy = 1;
        c.gridwidth = 1;
        hauptPanel.add(txtNachname, c);

        /**
         * TextFeld und Label für Raum.
         */
        c.gridx = 0;
        c.gridy = 2;
        c.gridwidth = 1;
        hauptPanel.add(new JLabel("Raum:", JLabel.RIGHT), c);
        txtRaum = erstelleTextFeld(STR_RAUM, false);

        c.gridx = 1;
        c.gridy = 2;
        c.gridwidth = 1;
        hauptPanel.add(txtRaum, c);

        /**
         * TextFeld und Label für Telefon.
         */
        c.gridx = 0;
        c.gridy = 3;
        c.gridwidth = 1;
        hauptPanel.add(new JLabel("Telefon:", JLabel.RIGHT), c);
        txtTelefon = erstelleTextFeld(STR_TELEFON, false);

        c.gridx = 1;
        c.gridy = 3;
        c.gridwidth = 1;
        hauptPanel.add(txtTelefon, c);

        /**
         * TextFeld und Label für E-Mail.
         */
        c.gridx = 0;
        c.gridy = 4;
        c.gridwidth = 1;
        hauptPanel.add(new JLabel("E-Mail:", JLabel.RIGHT), c);
        txtEmail = erstelleTextFeld(STR_EMAIL, false);

        c.gridx = 1;
        c.gridy = 4;
        c.gridwidth = 1;
        hauptPanel.add(txtEmail, c);

        /**
         * Speichern-Button.
         */
        buttonSpeichern = new JButton("Speichern");
        buttonSpeichern.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                if (!txtVorname.getText().equals("") &&
                        !txtVorname.getText().equals(STR_VORNAME) &&
                        !txtNachname.getText().equals("") &&
                        !txtNachname.getText().equals(STR_NACHNAME)) {
                    Person p = null;
                    if (person == null) {
                        p = ic.erstellePerson(txtVorname.getText(),
                                txtNachname.getText(),
                                txtRaum.getText(),
                                txtTelefon.getText(),
                                txtEmail.getText());
                        // Neuen Kalender für Person erstellen.
                        int personId = 0;
                        try {
                            personId = p.getPersonId();
                        } catch (RemoteException ex) {
                            Logger.getLogger(DialogPerson.class.getName()).
                                    log(Level.SEVERE, null, ex);
                        }
                        Vector<Integer> berechtigteIds = new Vector<Integer>();
                        berechtigteIds.add(personId);
                        ic.erstelleKalender(txtVorname.getText() + "s Kalender",
                                personId, berechtigteIds);
                    } else {
                        p = ic.bearbeitePerson(person,
                                txtVorname.getText(),
                                txtNachname.getText(),
                                txtRaum.getText(),
                                txtTelefon.getText(),
                                txtEmail.getText());
                    }

                    hauptFenster.erstellePersonenVerwaltung();
                    SwingUtilities.updateComponentTreeUI(hauptFenster);
                    setVisible(false);
                    dispose();
                    try {
                        hauptFenster.setzteListIndex(p.getNachname() + ", " + p.
                                getVorname());
                        JOptionPane.showMessageDialog(hauptFenster, "Person '" +
                                p.getVorname() + " " + p.getNachname() +
                                "' erfolgreich gespeichert!");
                    } catch (RemoteException ex) {
                        Logger.getLogger(InterfaceClient.class.getName()).log(
                                Level.SEVERE, null, ex);
                    }
                } else {
                    zeigeErrorDialog();
                }
            }
        });
        c.gridx = 1;
        c.gridy = 5;
        c.gridwidth = 1;
        hauptPanel.add(buttonSpeichern, c);

        return hauptPanel;
    }

    /**
     * Erstellt ein JTextFeld, das je nach Platzhalter mit Text befüllt wird.
     * Der boolsche Wert dient der Entscheidung, ob immer wieder der Platzhalter
     * im Feld erscheinen soll, wenn dieses leer bleibt oder dieser nur inital
     * erscheinen soll.
     *
     * @param   platzhalter
     * @param   permanenterPlatzhalter
     * @return  JTextField              mit Text und FocusListener.
     */
    public JTextField erstelleTextFeld(String platzhalter,
            boolean permanenterPlatzhalter) {
        JTextField textFeld = new JTextField();

        if (person == null) {
            textFeld.setText(platzhalter);
        } else {
            try {
                if (platzhalter.equals(STR_VORNAME)) {
                    textFeld.setText(person.getVorname());
                }
                if (platzhalter.equals(STR_NACHNAME)) {
                    textFeld.setText(person.getNachname());
                }
                if (platzhalter.equals(STR_RAUM)) {
                    textFeld.setText(person.getRaum());
                }
                if (platzhalter.equals(STR_TELEFON)) {
                    textFeld.setText(person.getTelefon());
                }
                if (platzhalter.equals(STR_EMAIL)) {
                    textFeld.setText(person.getEmail());
                }
            } catch (RemoteException ex) {
                Logger.getLogger(DialogPerson.class.getName()).log(Level.SEVERE,
                        null, ex);
            }
        }

        textFeld.addFocusListener(new TextFeldFocusListener(platzhalter,
                permanenterPlatzhalter));

        return textFeld;
    }

    /**
     * Zeigt einen Fehlerdialog, der auf Fehler bei der Formulareingabe
     * aufmerksam machen.
     */
    public void zeigeErrorDialog() {
        JOptionPane.showMessageDialog(DialogPerson.this,
                "Die Felder 'Vorname' und 'Nachname' dürfen nicht leer sein.",
                "Fehler beim Speichern", JOptionPane.ERROR_MESSAGE);
    }
}
